#pragma once
#include <iostream>
#include <vector>
#include <deque>
#include"Particle.h"
#include "config.h"
#include "Pose3D.h"
using namespace std;
class LogCat
{
public:
	LogCat();
	~LogCat();
	template<typename T>
	void DisplayVector(const vector<T>& v);
	void DisplayParticle( deque<Particle<Pose3D>>& particles) const;
	template<typename T>
	static void c(const string& TAG,const string& content, const T& data);
	template<typename T>
	static void c(const string& TAG,const T& data);
	template<typename T>
	static void c(const string& TAG, const string& content, vector<T>& data);
	template<typename T>
	static void c(const string& TAG, vector<T>& data);
	template<typename T>
	static void h(const string& TAG, const string& content, const T& data);
	template<typename T>
	static void h(const string& TAG, const T& data);
	template<typename T>
	static void h(const string& TAG, const string& content, vector<T>& data);
	template<typename T>
	static void h(const string& TAG, vector<T>& data);
};
template<typename T>
void LogCat::DisplayVector(const vector<T>& v)
{
	for (auto& p : v) {
		cout << p << " ";
	}
	cout << endl;
}

template<typename T>
inline void LogCat::c(const string & TAG, const string & content,  const T & data)
{

	cout << TAG << "( " << content << ") : " << data << endl;
}

template<typename T>
inline void LogCat::c(const string & TAG, const T & data)
{
	cout << TAG << ":" << data << endl;
}

template<typename T>
inline void LogCat::c(const string & TAG, const string & content, vector<T>& data)
{
	cout << TAG << "( " << content << " ) : ";
	for (auto& p : data) {
		cout << p << " ";
	}
	cout << endl;
}

template<typename T>
inline void LogCat::c(const string & TAG, vector<T>& data)
{
	cout << TAG << ":";
	for (auto& p : data) {
		cout << p << " ";
	}
	cout << endl;
}

template<typename T>
inline void LogCat::h(const string & TAG, const string & content, const T & data)
{
	if (HISTORY_LOGCAT) {
		cout << TAG << "( " << content <<" ) : " << data << endl;
	}
}

template<typename T>
inline void LogCat::h(const string & TAG, const T & data)
{
	if (HISTORY_LOGCAT) {
		cout << TAG << ":" << data << endl;
	}
}

template<typename T>
inline void LogCat::h(const string & TAG, const string & content, vector<T>& data)
{
	if (HISTORY_LOGCAT) {
		cout << TAG << "( " << content << " ) : ";
		for (auto& p : data) {
			cout << p << " ";
		}
		cout << endl;
	}
}

template<typename T>
inline void LogCat::h(const string & TAG, vector<T>& data)
{
	if (HISTORY_LOGCAT) {
		cout << TAG << ":";
		for (auto& p : data) {
			cout << p << " ";
		}
		cout << endl;
	}
}

